
    <!DOCTYPE html>
    <html lang="zh-CN">
    <head>
      <meta charset="UTF-8">
      <meta name="viewport" content="width=device-width, initial-scale=1.0">
      <title>3、Oracle对象 - 学习卡片</title>
      <style>
        body { font-family: sans-serif; background-color: #f0f8ff; color: #333; display: flex; flex-direction: column; align-items: center; padding: 50px 20px; }
        .header h1 { font-size: 32px; }
        .grid-container { display: grid; grid-template-columns: repeat(3, 1fr); gap: 28px; width: 100%; max-width: 1200px; }
        .card-container { perspective: 1200px; cursor: pointer; height: 250px; }
        .card { width: 100%; height: 100%; position: relative; transform-style: preserve-3d; transition: transform 0.7s; border-radius: 16px; box-shadow: 0 4px 16px rgba(0,0,0,0.08); }
        .card-container.flipped .card { transform: rotateY(180deg); }
        .card-face { position: absolute; width: 100%; height: 100%; backface-visibility: hidden; display: flex; flex-direction: column; box-sizing: border-box; border-radius: 16px; background-color: #fff; padding: 24px; }
        .card-back { background-color: #f0fff4; transform: rotateY(180deg); justify-content: space-between; }
        .card-category { font-size: 14px; color: #0052d9; margin-bottom: 8px; font-weight: 500; }
        .card-question { font-size: 20px; font-weight: 500; flex-grow: 1; display: flex; align-items: center; justify-content: center; text-align: center; }
        .card-answer-wrapper { flex-grow: 1; overflow-y: auto; }
        .card-answer { font-size: 15px; line-height: 1.7; }
        .card-footer { font-size: 13px; color: #8a919f; border-top: 1px solid #f0f0f0; padding-top: 16px; margin-top: 16px; }
        .card-source { font-size: 13px; color: #8a919f; border-top: 1px solid #f0f0f0; padding-top: 12px; margin-top: 12px; }
      </style>
    </head>
    <body>
      <div class="header">
        <h1>3、Oracle对象 - 学习卡片</h1>
      </div>
      <div class="grid-container">
        
    <div class="card-container" onclick="this.classList.toggle('flipped');">
      <div class="card">
        <div class="card-face card-front">
          <div class="card-category">特性</div>
          <div class="card-question">在 Oracle 中，`DATE` 和 `TIMESTAMP` 这两种日期数据类型有何区别？</div>
          <div class="card-footer">点击卡片查看答案</div>
        </div>
        <div class="card-face card-back">
          <div class="card-category">特性</div>
          <div class="card-answer-wrapper">
            <div class="card-answer">`DATE` 表示的是不包含毫秒的日期类型，而 `TIMESTAMP` 表示的是包含毫秒的日期类型。</div>
          </div>
          <div class="card-source">来源: 1.2 Oracle中常用的数据类型</div>
        </div>
      </div>
    </div>

    <div class="card-container" onclick="this.classList.toggle('flipped');">
      <div class="card">
        <div class="card-face card-front">
          <div class="card-category">规则</div>
          <div class="card-question">在 Oracle 中创建表时，对于表名和列名的定义有哪些命名要求？</div>
          <div class="card-footer">点击卡片查看答案</div>
        </div>
        <div class="card-face card-back">
          <div class="card-category">规则</div>
          <div class="card-answer-wrapper">
            <div class="card-answer">主要有四个要求：1. 必须以字母开头；2. 长度为1到30个字符；3. 对于同一用户，不能使用相同的表名称；4. 不能使用 Oracle 中的保留字。</div>
          </div>
          <div class="card-source">来源: 1.3 表的创建</div>
        </div>
      </div>
    </div>

    <div class="card-container" onclick="this.classList.toggle('flipped');">
      <div class="card">
        <div class="card-face card-front">
          <div class="card-category">技术</div>
          <div class="card-question">Oracle 的“闪回技术”是什么？如何使用它来恢复被删除的表？</div>
          <div class="card-footer">点击卡片查看答案</div>
        </div>
        <div class="card-face card-back">
          <div class="card-category">技术</div>
          <div class="card-answer-wrapper">
            <div class="card-answer">闪回技术用于恢复被删除的表。在 Oracle 中，被删除的表会存放在一个名为 `recyclebin` 的表中（类似于回收站）。要恢复表，可以使用语法：`FLASHBACK TABLE 表名称 TO BEFORE DROP`。</div>
          </div>
          <div class="card-source">来源: 1.7 闪回技术</div>
        </div>
      </div>
    </div>

    <div class="card-container" onclick="this.classList.toggle('flipped');">
      <div class="card">
        <div class="card-face card-front">
          <div class="card-category">理论</div>
          <div class="card-question">数据库事务的四大特性（ACID）分别是什么？</div>
          <div class="card-footer">点击卡片查看答案</div>
        </div>
        <div class="card-face card-back">
          <div class="card-category">理论</div>
          <div class="card-answer-wrapper">
            <div class="card-answer">1. 原子性(Atomicity)：事务中的操作要么全部完成，要么均不执行。2. 一致性(Consistency)：并行事务的执行结果必须与按某一顺序串行执行的结果相一致。3. 隔离性(Isolation)：事务的执行不受其他事务的干扰。4. 持久性(Durability)：已提交事务对数据库的改变必须是永久的，即使数据库出现故障也不会丢失。</div>
          </div>
          <div class="card-source">来源: 4.1事务四大特性(简称ACID) </div>
        </div>
      </div>
    </div>

    <div class="card-container" onclick="this.classList.toggle('flipped');">
      <div class="card">
        <div class="card-face card-front">
          <div class="card-category">理论</div>
          <div class="card-question">什么是数据库视图（View），它有哪些主要优点？</div>
          <div class="card-footer">点击卡片查看答案</div>
        </div>
        <div class="card-face card-back">
          <div class="card-category">理论</div>
          <div class="card-answer-wrapper">
            <div class="card-answer">视图是基于一个或多个表（或视图）的逻辑表，本身不包含数据。其优点包括：1. 限制对数据库的访问，提高安全性；2. 用户可以通过简单的查询从复杂查询中得到结果；3. 维护数据的独立性；4. 可为相同的数据产生不同的视图。</div>
          </div>
          <div class="card-source">来源: 5. 视图</div>
        </div>
      </div>
    </div>

    <div class="card-container" onclick="this.classList.toggle('flipped');">
      <div class="card">
        <div class="card-face card-front">
          <div class="card-category">机制</div>
          <div class="card-question">Oracle 中的序列（Sequence）是用来做什么的？`nextval` 和 `currval` 有什么区别？</div>
          <div class="card-footer">点击卡片查看答案</div>
        </div>
        <div class="card-face card-back">
          <div class="card-category">机制</div>
          <div class="card-answer-wrapper">
            <div class="card-answer">序列是 Oracle 提供的用于产生一系列唯一数字的数据库对象，主要用于提供主键值。`序列名称.nextval` 用于获取序列的下一个值，每次调用都会使序列增长。`序列名称.currval` 用于获取当前序列值，多次调用其值不会改变。</div>
          </div>
          <div class="card-source">来源: 6. 序列 & 6.3 使用序列</div>
        </div>
      </div>
    </div>

    <div class="card-container" onclick="this.classList.toggle('flipped');">
      <div class="card">
        <div class="card-face card-front">
          <div class="card-category">特性</div>
          <div class="card-question">请解释 Oracle 中的伪列（Pseudocolumn）是什么，并说明 `ROWID` 和 `ROWNUM` 的区别。</div>
          <div class="card-footer">点击卡片查看答案</div>
        </div>
        <div class="card-face card-back">
          <div class="card-category">特性</div>
          <div class="card-answer-wrapper">
            <div class="card-answer">伪列的操作类似于表中的列，但它并不实际保存在表中。`ROWID` 是一个唯一标识记录物理位置的ID。`ROWNUM` 是在用户查询数据时，为查询结果中的每一行动态分配的行号。</div>
          </div>
          <div class="card-source">来源: 7. 伪列 & 7.1 ROWID伪列 & 7.2 ROWNUM伪列</div>
        </div>
      </div>
    </div>

    <div class="card-container" onclick="this.classList.toggle('flipped');">
      <div class="card">
        <div class="card-face card-front">
          <div class="card-category">理论</div>
          <div class="card-question">什么是数据库索引（Index），它的主要作用是什么？</div>
          <div class="card-footer">点击卡片查看答案</div>
        </div>
        <div class="card-face card-back">
          <div class="card-category">理论</div>
          <div class="card-answer-wrapper">
            <div class="card-answer">索引是数据库对象之一，用于加快数据的检索，类似于书籍的索引。在数据库中，索引可以减少数据库程序查询结果时需要读取的数据量，从而提高查询效率。</div>
          </div>
          <div class="card-source">来源: 8. 索引</div>
        </div>
      </div>
    </div>

    <div class="card-container" onclick="this.classList.toggle('flipped');">
      <div class="card">
        <div class="card-face card-front">
          <div class="card-category">模式</div>
          <div class="card-question">根据文档，在哪些类型的列上创建索引可以有效提升性能？</div>
          <div class="card-footer">点击卡片查看答案</div>
        </div>
        <div class="card-face card-back">
          <div class="card-category">模式</div>
          <div class="card-answer-wrapper">
            <div class="card-answer">在以下几种列上创建索引是有效的：1. 经常需要搜索的列；2. 作为主键的列；3. 经常用于连接的列（如外键）；4. 经常需要根据范围进行搜索的列；5. 经常需要排序的列；6. 经常在 WHERE 子句中使用的列。</div>
          </div>
          <div class="card-source">来源: 8.4 说明</div>
        </div>
      </div>
    </div>

    <div class="card-container" onclick="this.classList.toggle('flipped');">
      <div class="card">
        <div class="card-face card-front">
          <div class="card-category">语法</div>
          <div class="card-question">在 Oracle 中，修改表结构时，用于添加字段、修改字段名和删除字段的 SQL 命令分别是什么？</div>
          <div class="card-footer">点击卡片查看答案</div>
        </div>
        <div class="card-face card-back">
          <div class="card-category">语法</div>
          <div class="card-answer-wrapper">
            <div class="card-answer">1. 添加字段：`ALTER TABLE 表名称 ADD (字段名称 字段类型 ...)`；2. 修改字段名：`ALTER TABLE 表名 RENAME COLUMN 原字段名 TO 新字段名`；3. 删除字段：`ALTER TABLE 表名 DROP COLUMN 列名称`。</div>
          </div>
          <div class="card-source">来源: 1.8 修改变结构</div>
        </div>
      </div>
    </div>

    <div class="card-container" onclick="this.classList.toggle('flipped');">
      <div class="card">
        <div class="card-face card-front">
          <div class="card-category">理论</div>
          <div class="card-question">文档中列举了 Oracle 的五种主要约束，它们分别是什么？</div>
          <div class="card-footer">点击卡片查看答案</div>
        </div>
        <div class="card-face card-back">
          <div class="card-category">理论</div>
          <div class="card-answer-wrapper">
            <div class="card-answer">文档中列举的五种约束是：1. 非空约束 (Not Null)；2. 唯一约束 (Unique)；3. 主键约束 (Primary Key)；4. 检查约束 (Check)；5. 主外键约束 (Foreign Key)。</div>
          </div>
          <div class="card-source">来源: 2 数据库约束</div>
        </div>
      </div>
    </div>

    <div class="card-container" onclick="this.classList.toggle('flipped');">
      <div class="card">
        <div class="card-face card-front">
          <div class="card-category">语法</div>
          <div class="card-question">在 Oracle 中，实现分页查询的基本语法结构是怎样的？</div>
          <div class="card-footer">点击卡片查看答案</div>
        </div>
        <div class="card-face card-back">
          <div class="card-category">语法</div>
          <div class="card-answer-wrapper">
            <div class="card-answer">分页查询通常使用 ROWNUM 伪列和嵌套子查询来实现，基本语法结构为：`SELECT * FROM (SELECT a.*, ROWNUM rn FROM (SELECT * FROM 表名称) a WHERE ROWNUM <= :end) WHERE rn > :start`。文档中给出的具体语法是：`SELECT * FROM (SELECT 列..., ROWNUM rn FROM 表名称 WHERE ROWNUM <= (currentPage * pageSize)) temp WHERE temp.rn > ((currentPage-1) * pageSize)`。</div>
          </div>
          <div class="card-source">来源: 7.3 分页</div>
        </div>
      </div>
    </div>

      </div>
    </body>
    </html>
